﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using ICT4Events;
using ICT4Events.Models;
using System.Net.Mail;

namespace ICT4Events.Controllers
{
    [HandleError]
    public class HomeController : Controller
    {
        public ActionResult Index()
        {
            return View();
        }
        
        public ActionResult About()
        {
            return View();
        }

        public ActionResult Reserveringen()
        {   
            
            return View(DatabaseKoppeling.GetReserveringen());
        }

        public ActionResult NieuweReservering()
        {
            if (GetTypeCookie() != "Klant_betalend")
            {
                return RedirectToAction("LogOff", "Account");
            }
            var gereserveerd = DatabaseKoppeling.GetAlleGereserveerdePlaatsen();
            var kamp = DatabaseKoppeling.GetKampeerplekken();


            var kamplist = new List<Kampeerplek>();

            foreach (Kampeerplek k in kamp)
            {
                for (int i = 0; i < gereserveerd.Count(); i++)
                {
                    if (k.PlaatsNummer == gereserveerd[i])
                    {
                        kamplist.Add(k);
                    }
                }
            }

            foreach (Kampeerplek k in kamplist)
            {
                kamp.Remove(k);
            }
            List<SelectListItem> sl = new List<SelectListItem>();
            for (int i = 1; i <= 10; i++)
            {
                SelectListItem sli = new SelectListItem();
                sli.Text = i.ToString();
                sli.Value = i.ToString();
                sl.Add(sli);
            }
            ViewData["kpg"] = kamplist;
            ViewData["AantalPersonen"] = new SelectList(sl, "text", "text");
            return View(kamp);
        }
        [AcceptVerbs(HttpVerbs.Post)]
        public ActionResult NieuweReservering(FormCollection form)
        {
            if (GetTypeCookie() != "Klant_betalend")
            {
                return RedirectToAction("LogOff", "Account");
            }
            var a = Convert.ToInt32(form["aantalPersonen"]);

            if (form["Kampeerplaats"] == "0")
            {
                ModelState.AddModelError("", "Er is geen kampeerplaats gekozen!");
            }
            else
            {
                try
                {
                    var bk = DatabaseKoppeling.GetKlantBetalend(GetReserveringsnummerCookie());
                    
                    string emailBody="";
                    for (int i = 0; i < a; i++)
                    {
                        string vrijRFID = DatabaseKoppeling.GetVrijRFID();
                        Klant klant = new Klant(vrijRFID, GetReserveringsnummerCookie());
                        DatabaseKoppeling.AddKlant(klant);
                        
                        emailBody += "RFID: "+klant.Rfid+"\nWachtwoord: "+klant.Wachtwoord+"\n\n";
                    }
                    DatabaseKoppeling.AddReserveringPlaats(GetReserveringsnummerCookie(), form["Kampeerplaats"]);
                    Email.SendEmail(new MailAddress(bk.Email),
                              "ICT4Events account(s) aangemaakt",
                              "Beste " + bk.Naam +
                              ",\n\nEr zijn sub-accounts voor u aangemaakt. De inloggegevens zijn als volgt:\nReserveringsnummer: " + bk.Reserveringsnummer.ToString() + "\n\n" + emailBody + "\nMet vriendelijke groeten,\nICT4Events staff");
                    return RedirectToAction("Reservering","Home");
                    
                }
                catch (Exception ex)
                {
                    ModelState.AddModelError("",ex.Message);
                }
            }

            var gereserveerd = DatabaseKoppeling.GetAlleGereserveerdePlaatsen();
            var kamp = DatabaseKoppeling.GetKampeerplekken();
            var kamplist = new List<Kampeerplek>();

            foreach (Kampeerplek k in kamp)
            {
                for (int i = 0; i < gereserveerd.Count(); i++)
                {
                    if (k.PlaatsNummer == gereserveerd[i])
                    {
                        kamplist.Add(k);
                    }
                }
            }

            foreach (Kampeerplek k in kamplist)
            {
                kamp.Remove(k);
            }
            List<SelectListItem> sl = new List<SelectListItem>();
            for (int i = 1; i <= 10; i++)
            {
                SelectListItem sli = new SelectListItem();
                sli.Text = i.ToString();
                sli.Value = i.ToString();
                sl.Add(sli);
            }
            ViewData["kpg"] = kamplist;
            ViewData["AantalPersonen"] = new SelectList(sl, "text", "text");
            return View(kamp);
        }

        public ActionResult Reservering()
        {
            List<Kampeerplek> k = DatabaseKoppeling.GetReserveringPlaatsen(GetReserveringsnummerCookie());
            ViewData["aantalpersonen"] = DatabaseKoppeling.GetAantalPersonen(GetReserveringsnummerCookie());
            ViewData["rfidlist"] = DatabaseKoppeling.GetKlanten(GetReserveringsnummerCookie()).OrderBy(x=>x).ToList();
            ViewData["bk"] = DatabaseKoppeling.GetKlantBetalend(GetReserveringsnummerCookie());
            return View(k);
        }
        
        public ActionResult Materiaalverhuur()
        {
            ViewData["Materiaal"] = new SelectList(DatabaseKoppelingMateriaal.getMateriaal(), "Type", "Type"); DatabaseKoppelingMateriaal.getMateriaal();
            var a = DatabaseKoppelingMateriaal.getUitlening(GetReserveringsnummerCookie());
            return View(DatabaseKoppelingMateriaal.getUitlening(GetReserveringsnummerCookie()));
        }

        [AcceptVerbs(HttpVerbs.Post)]
        public ActionResult Materiaalverhuur(FormCollection form)
        {
            var begin = form["BeginDatum"];
            var eind = form["EindDatum"];
            if (String.IsNullOrEmpty(begin))
                ModelState.AddModelError("", "De begindatum is niet ingevoerd!");
            if (String.IsNullOrEmpty(eind))
                ModelState.AddModelError("", "De einddatum is niet ingevoerd!");
            
            DatabaseKoppelingMateriaal.addUitlening(GetReserveringsnummerCookie(), DatabaseKoppelingMateriaal.getMateriaal().ToList().Where(x=>x.Type == (form["Materiaal"])).Single(), begin, eind);

            ViewData["Materiaal"] = new SelectList(DatabaseKoppelingMateriaal.getMateriaal(), "Type", "Type"); DatabaseKoppelingMateriaal.getMateriaal();
            var a = DatabaseKoppelingMateriaal.getUitlening(GetReserveringsnummerCookie());
            return View(DatabaseKoppelingMateriaal.getUitlening(GetReserveringsnummerCookie()));
        }

        public PartialViewResult GetInformatie(string type)
        {
            var materiaal = DatabaseKoppelingMateriaal.getMateriaal().Where(x => x.Type == type).Single();
            var aantal = DatabaseKoppelingMateriaal.GetHoeveelheidMateriaal(materiaal);
            materiaal.Aantal = aantal;
            return PartialView("_Informatie", materiaal);
        }

        public string GetRfidCookie()
        {
            
            try
            {
                return this.ControllerContext.HttpContext.Request.Cookies["rfid"].Value;
            }
            catch
            {
                return "";
            }
        }

        public string GetTypeCookie()
        {
            try
            {
                return this.ControllerContext.HttpContext.Request.Cookies["type"].Value;
            }
            catch
            {
                return "";
            }
        }

        public int GetReserveringsnummerCookie()
        {

            try
            {
                return Convert.ToInt32(this.ControllerContext.HttpContext.Request.Cookies["res"].Value);
            }
            catch
            {
                return 0;
            }
        }
    }
}
